{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3dd06a42-ad77-4039-9bfb-0a259a5b24d6",
   "metadata": {},
   "source": [
    "# 2-1-1 无理取闹\n",
    "\n",
    "**课程目标**: 取一个无理数根号2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8fba133-f895-4ad3-bfb9-7217b46eccb0",
   "metadata": {},
   "source": [
    "## 根号 (√) 的概念与应用\n",
    "\n",
    "### 1. 认识平方：从正方形出发\n",
    "\n",
    "我们先来看一个正方形。假设它的边长是 2，那么它的面积可以用公式计算：\n",
    "\n",
    "```\n",
    "面积 = 边长 × 边长 = 2 × 2 = 4\n",
    "```\n",
    "\n",
    "同样，如果边长是 3，面积就是：\n",
    "\n",
    "```\n",
    "3 × 3 = 9\n",
    "```\n",
    "\n",
    "这个过程称为 **平方**，表示一个数自身相乘。例如：\n",
    "\n",
    "- `1² = 1`\n",
    "- `2² = 4`\n",
    "- `3² = 9`\n",
    "- `4² = 16`\n",
    "\n",
    "### 2. 反向思考：从面积求边长\n",
    "\n",
    "如果我们已经知道正方形的面积，能不能反推出边长呢？\n",
    "\n",
    "- 面积是 9，边长是多少？ **3**\n",
    "- 面积是 16，边长是多少？ **4**\n",
    "\n",
    "但如果面积是 2 呢？这个时候边长不是整数，我们就需要使用 **平方根** 的概念。\n",
    "\n",
    "### 3. 认识平方根与根号\n",
    "\n",
    "平方根就是反向求平方的数，用 **根号 (√)** 表示。\n",
    "\n",
    "```\n",
    "√a = x  意味着  x × x = a\n",
    "```\n",
    "\n",
    "例如：\n",
    "\n",
    "- `√4 = 2` ，因为 `2 × 2 = 4`\n",
    "- `√9 = 3` ，因为 `3 × 3 = 9`\n",
    "- `√16 = 4` ，因为 `4 × 4 = 16`\n",
    "\n",
    "但 `√2` 呢？我们可以猜测它在 1 和 2 之间。\n",
    "\n",
    "### 4. 近似计算 `√2`\n",
    "\n",
    "我们知道：\n",
    "\n",
    "- `1² = 1`\n",
    "- `2² = 4`\n",
    "\n",
    "所以 `√2` 介于 `1` 和 `2` 之间。 我们可以尝试取 **1.4** 计算：\n",
    "\n",
    "```\n",
    "1.4 × 1.4 = 1.96  (接近 2)\n",
    "```\n",
    "\n",
    "再试 **1.5**：\n",
    "\n",
    "```\n",
    "1.5 × 1.5 = 2.25  (超过 2)\n",
    "```\n",
    "\n",
    "因此，`√2 ≈ 1.4` 到 `1.5` 之间，我们可以通过二分法求得更精确的值。\n",
    "\n",
    "### 5. 二分法求 `√2`\n",
    "\n",
    "二分法是一种不断缩小范围的方法。例如：\n",
    "\n",
    "1. 取区间 `[1,2]`，计算中点 `1.5`，发现 `1.5² > 2`，所以新范围是 `[1, 1.5]`\n",
    "2. 继续取中点 `1.25`，发现 `1.25² < 2`，所以新范围是 `[1.25, 1.5]`\n",
    "3. 继续逼近，最终得到 `√2 ≈ 1.414`\n",
    "\n",
    "### 6. 结论与应用\n",
    "\n",
    "- **平方** 是一个数自身相乘\n",
    "- **平方根** 是平方的逆运算，用 **根号 (√)** 表示\n",
    "- **`√2`** 不是整数，可以用二分法计算近似值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70e21b1c-f704-4a18-98b9-6105a5af965d",
   "metadata": {},
   "source": [
    "## 使用 Python 计算无理数  \n",
    "\n",
    "在 Python 中，我们可以使用 `math` 库来处理无理数，如计算平方根和获取数学常数 π。  \n",
    "\n",
    "1. **引入 `math` 库**：Python 内置的 `math` 模块提供了许多数学运算功能，可用于处理无理数。  \n",
    "2. **计算平方根**：使用 `math.sqrt(n)` 可以求 `n` 的平方根，例如 `math.sqrt(2)` 返回 `√2` 的近似值。  \n",
    "3. **获取数学常数 π**：`math.pi` 提供 π 的高精度值，可用于圆周率相关计算，如 `math.pi * r**2` 计算圆的面积。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9f005b0b-8033-4aab-8f83-ca562a489ac7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.4142135623730951\n",
      "3.141592653589793\n"
     ]
    }
   ],
   "source": [
    "#使用计算器,python中math,提供了√算法\n",
    "\n",
    "#1.导入\n",
    "import math\n",
    "\n",
    "\n",
    "\n",
    "#2.按计算器\n",
    "f = math.sqrt(2)#√2  \n",
    "#sqrt(n) 代表 √n \n",
    "\n",
    "#打印输出根号2\n",
    "print(f) \n",
    "print(math.pi)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f54a1638-69cc-4515-891d-208df5d6156a",
   "metadata": {},
   "source": [
    "## **二分法**\n",
    "\n",
    "二分法（Binary Search Method）是一种**迭代逼近**的方法，常用于求解方程、寻找区间内的数值解。它的核心思想是**逐步缩小范围**，每次将区间折半，从而快速逼近目标值。\n",
    "\n",
    "1. **初始化范围** `[min, max]`，确保目标值在此区间内。\n",
    "\n",
    "2. **计算中点 `mid`**： mid=min+max2mid = \\frac{min + max}{2}\n",
    "\n",
    "3. 判断 `mid` 是否满足条件\n",
    "\n",
    "   ：\n",
    "\n",
    "   - 若 `mid` 过大，则调整 `max = mid`（缩小右侧范围）。\n",
    "   - 若 `mid` 过小，则调整 `min = mid`（缩小左侧范围）。\n",
    "\n",
    "4. **不断缩小范围**，直到 `mid` 足够接近目标值（达到设定的精度）。\n",
    "\n",
    "------\n",
    "\n",
    "\n",
    "\n",
    "### 二分法求平方根  \n",
    "\n",
    "**步骤如下：**  \n",
    "1. **确定范围**：定义最大值和最小值，例如 `1 < √2 < 2`。  \n",
    "2. **猜测中间值**：每次取区间的中点 `mid = (min + max) / 2`。  \n",
    "3. **判断大小**：计算 `mid²`，如果 `mid² > 2`，说明猜大了，更新 `max = mid`；如果 `mid² < 2`，说明猜小了，更新 `min = mid`。  \n",
    "4. **缩小范围**：不断折半查找，直到 `mid²` 足够接近 `2`。  \n",
    "\n",
    "**示例计算过程：**  \n",
    "- 初始范围：`1 < √2 < 2`  \n",
    "- 第一次猜测：`mid = 1.5 → 1.5² = 2.25` （偏大，更新 `max = 1.5`）  \n",
    "- 第二次猜测：`mid = 1.25 → 1.25² = 1.5625` （偏小，更新 `min = 1.25`）  \n",
    "- 第三次猜测：`mid = 1.375 → 1.375² = 1.8906` （偏小，更新 `min = 1.375`）  \n",
    "- … 持续迭代，最终收敛到 `√2 ≈ 1.414`  \n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "dd7586a2-26d3-418c-80ea-49cbddf9be1a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.414213562373095\n"
     ]
    }
   ],
   "source": [
    "maxn = 2\n",
    "minn = 1\n",
    "mid = 0 #中间值\n",
    "\n",
    "#取得次数越多,越接近最终答案\n",
    "for i in range(100):\n",
    "    # 1.取中间值\n",
    "    mid = (maxn+minn)/2\n",
    "    # 2.中间值的平方跟2比较\n",
    "\n",
    "    #如果中间值大了,取左半段\n",
    "    if mid*mid>2:\n",
    "        # 3.改范围,改极值\n",
    "        #调整最大值\n",
    "        maxn = mid\n",
    "    #如果中间值小了,取右半段\n",
    "    else:\n",
    "        #调整最小值\n",
    "        minn = mid\n",
    "\n",
    "#打印最接近的值,中间值    \n",
    "print(mid)     \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b29b1010-0f98-49a5-9ec1-120353b0ff4b",
   "metadata": {},
   "source": [
    "### 今日课程回顾\n",
    "\n",
    "1. **什么是根号**  \n",
    "   根号（√）是表示“开平方”的符号，就是找一个数，它的平方（数×数）等于给定的数。比如√9 = 3，因为3×3 = 9。\n",
    "\n",
    "2. **开根号的实际意义**  \n",
    "   开根号可以帮我们解决很多问题，比如知道一个正方形的面积是9，想知道它的边长是多少，就可以用根号来计算。\n",
    "\n",
    "3. **无理数**  \n",
    "   无理数是不能用简简单单的分数表示的数，比如√2，它的数字无限多且不重复，不能完全写出来。\n",
    "\n",
    "4. **什么是二分法？可以用在哪？**  \n",
    "   二分法是一种分半的方法，帮助我们快速找到一个数。例如，求一个数的平方根时，可以通过不断缩小范围，逐渐逼近正确答案。\n",
    "\n",
    "5. **二分法取√2**  \n",
    "   想要知道√2，可以从1和2之间开始，每次都取它们的中间值，看看平方后接近2多少次，直到找到答案。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "62308b14-0619-4882-8611-5da436ab1d8a",
   "metadata": {},
   "source": [
    "### 作业启示\n",
    "#### 圆的面积公式 \n",
    "面积 =  math.pi * R**2\n",
    "#### 根据面积求半径  \n",
    "   1. 根据面积求r**2 = 面积/math.pi\n",
    "   2. 开平方 math.sqrt(r**2),也可以用二分法"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
